package ai.kastrax.evals.metrics.llm

import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals

class UsefulnessMetricTest {
    
    @Test
    fun testUsefulnessEvaluation() = runBlocking {
        // 创建模拟 LLM 客户端
        val mockResponses = mapOf(
            """
            请评估以下回答对用户的有用性。
            
            问题：如何提高英语口语水平？
            
            回答：要提高英语口语水平，你可以每天练习口语，与母语为英语的人交流，观看英语电影和电视节目，参加英语角或语言交换活动，使用语言学习应用程序，大声朗读英语文章，录制自己说英语并回听，不要害怕犯错，保持耐心和持续性。
            
            请根据回答的有用性给出 0 到 10 的评分，其中 0 表示完全没有用，10 表示非常有用。
            评估有用性时，请考虑以下因素：
            1. 回答是否直接解决了用户的问题
            2. 回答是否提供了足够的信息
            3. 回答是否清晰易懂
            4. 回答是否提供了实用的建议或指导
            5. 回答是否帮助用户更好地理解问题
            
            请首先分析回答的有用性，然后给出评分。
            
            评分：
            """.trimIndent() to """
            分析：
            1. 回答直接解决了用户的问题，提供了多种提高英语口语水平的方法。
            2. 回答提供了丰富的信息，包括多种不同的练习方式和学习策略。
            3. 回答非常清晰易懂，使用简洁的语言列出了多个具体的建议。
            4. 回答提供了实用的建议，如每天练习、与母语者交流、观看英语媒体等，这些都是公认的有效方法。
            5. 回答帮助用户理解提高口语是一个需要多方面努力和持续练习的过程。

            总体来说，这个回答非常全面，提供了多种实用的方法来提高英语口语水平，涵盖了不同的学习场景和策略，对用户非常有帮助。

            评分：9
            """.trimIndent(),
            
            """
            请评估以下回答对用户的有用性。
            
            问题：如何提高英语口语水平？
            
            回答：多练习就行了。
            
            请根据回答的有用性给出 0 到 10 的评分，其中 0 表示完全没有用，10 表示非常有用。
            评估有用性时，请考虑以下因素：
            1. 回答是否直接解决了用户的问题
            2. 回答是否提供了足够的信息
            3. 回答是否清晰易懂
            4. 回答是否提供了实用的建议或指导
            5. 回答是否帮助用户更好地理解问题
            
            请首先分析回答的有用性，然后给出评分。
            
            评分：
            """.trimIndent() to """
            分析：
            1. 回答虽然直接回应了问题，但过于简略，没有提供具体的解决方案。
            2. 回答信息量极少，只有一个非常笼统的建议"多练习"，没有说明如何练习、练习什么、如何评估进步等。
            3. 回答虽然语言简单清晰，但因为内容太少，实际上并不能帮助用户理解如何有效提高口语。
            4. 回答没有提供任何具体的、可操作的建议或指导，用户无法根据这个回答采取有效行动。
            5. 回答没有帮助用户更好地理解问题或提高口语的复杂性。

            总体来说，这个回答虽然在技术上回应了问题，但实用性极低，几乎没有提供任何有价值的信息或指导。用户无法仅凭"多练习就行了"这样的建议来有效提高英语口语水平。

            评分：2
            """.trimIndent()
        )
        
        val mockLlmClient = MockLlmClient(mockResponses)
        val metric = usefulnessMetric(mockLlmClient)
        
        // 测试有用的回答
        val result1 = metric.calculate(
            input = "如何提高英语口语水平？",
            output = "要提高英语口语水平，你可以每天练习口语，与母语为英语的人交流，观看英语电影和电视节目，参加英语角或语言交换活动，使用语言学习应用程序，大声朗读英语文章，录制自己说英语并回听，不要害怕犯错，保持耐心和持续性。"
        )
        assertEquals(0.9, result1.score)
        
        // 测试不太有用的回答
        val result2 = metric.calculate(
            input = "如何提高英语口语水平？",
            output = "多练习就行了。"
        )
        assertEquals(0.2, result2.score)
    }
}
